Typical Usage
Typické použitie:
The examples are accompanied by sequence charts which demonstrate the sequence of calling the methods and events and internal processing of the A/D conversion.
These charts show detailed information about ADC bean algorithm for typical usage of this bean.
Each chart is composed of three processes.
The first ADC peripheral process represents a function of the internal ADC peripheral module of CPU.
Second ADC bean process represents a generated ADC bean code (interrupt routines, methods).
Third User application process represents a user written code.
Second and third processes are processed by CPU core, thus they cannot be performed concurrently and the control flow of CPU core is divided into these
processes.
Príklady sú doplnené o zobrazenia priebehov ktoré demonštrujú sekvencie
volajúcich metódy a udalosti a vnútorné procesy, ktoré predstavujú A/D
konverziu. Tieto obrázky predstavujú detailné informácie o algoritmoch
ADC beanu v ich typickom použití. Každý obrázok je zostavený z troch
procesov. Prvý ADC proces periférie predstavuje funkciu interného ADC modulu
procesora. Druhý proces ADC beanu predstavuje generovaný kód ADC beanu
(podprogram obsluhy prerušení, metódy). Tretí Aplikačný proces predstavuje
užívateľom napísaný kód. Druhý a tretí proces je vykonávaný jadrom CPU,
preto oni nemôžu byť vykonávané kokurenčne a riadiaci tok CPU jadra je
rozdelený do týchto procesov.
The meaning of the colors used in the diagrams
Jednotlivé významy používané v diagramoch zhora:
|
-
Užívateľský
aplikačný kód v hlavnom module
- Kód
metódy v beane
- Kód
obsluhy prerušenia v beane
- Užívateľský
aplikačný kód v module udalostí volaný z prerušenia.
- A/D
konvertor vykonáva konverziu.
- Volanie
metódy alebo výskyt udalosti
- Návrat
z metódy, udalosti alebo prerušenia.
- Prerušenie.
|
Typical settings and usage of ADC bean
Typické
nastavenie a použitie ADC beanu (prevodníka ANALOG na
DIGITAL)
Kontinuálna
konverzia všetkých kanálov, pomocou služby prerušenia
(2) One conversion of all channels, with interrupt service
Jedna konverzia všetkých kanálov, s
použitím služby prerušenia.
(3) One conversion of a specified channel, with interrupt service
Jedna konverzia špecifikovaného kanála, s
použitím služby prerušenia
(4) One conversion of all channels, in polling mode
Jedna konverzia všetkých kanálov, v pool
režime
(5) One conversion of all channels of each bean, in shared mode
Jedna konverzia všetkých kanálov každého
beanu, v sdielanom režime
(1)
Continuous conversion of all channels, with interrupt service
Kontinuálna konverzia všetkých kanálov, so službou prerušenia
Conversion of all channels/samples is performed repeatedly (using interrupts).
Property Interrupt service is enabled, Number of conversion is set to 1.
Conversion is started using Start method.
When a conversion of all channels/samples is finished the OnEnd event is invoked and a new set of measured values is available.
All these measured values are available for reading until the next measurement cycle is finished.
Conversion can be stopped using Stop method.
Konverzia všetkých kanálov/vzoriek je prevádzaná opakovane (s použitím
prerušení). Vlastnosť Služba prerušenia ( Interrupt service
) je povolená, počet konverzií ( Number of conversion
) je nastavený na 1. Konverzi aje odštartovaná použitím metódy Start ( Start
). Keď konverzia všetkých kanálov/vzoriek je ukončená vyvolá sa udalosť
OnEnd a je k dispozícii nová množina
nameraných hodnôt. Všetky tieto namerané hodnoty sú dostupné na čítanie
pokiaľ sa nedokončí nový cyklus meraní. Konverzia môže byť ukončená
použitím metódy Stop .
The example demonstrates the continuous conversion of three channels/samples.
Príklady demonštrujú kontinuálnu konverziu troch kanálov/vzoriek.
POZNÁMKA K PROGRAMU
Príklady treba brať s rezervou pretože slúžia len pre demonštračné príklady.
Popis algoritmov: Hlavný modul MAIN.C na začiatku zadefinuje konštantu počtu
meraní. Zadefinuje pole výsledkov z troch kanálov 0, 1 a 2 t.j. tri vzorky. Príkaz
AD1_Start(); odštartuje celý proces merania na pozadí. Potom aplikácia v
hlavnom programe vojde do nekonečnej slučky. Hardware prevodníka zatiaľ
vykonáva merania v ktorej sa zistia tri vzorky a umiestnia sa do poľa
Values zadefinovanom v hlavnom programe. Prevzatie nameraných hodnôt sa uskutoční
po vyvolaní prerušenia hardwarom (vid EVENTS.C). Prerušenie má za úlohu dve
veci: jednak prvezme vysledky a jednak zvýši počítadlo meraní v ktorom
signalizuje ktorá séria vzorkovania prebehla. tento údaj je taktiež
umiestnený v hlavnom module a predstavuje správu modulu EVENTS.C modulu MAIN.C.
V hlavnom module sa uskutoční 10 meraní
po ktorých sa zastaví generovanie prerušení príkazom. Počet meraní
indikuje globálna premenná ktorej hodnota sa v module EVENTS.C automaticky zvyšuje.
Nedajte sa zmýliť programom - nie je prakticky použiteľný. Je použiteľný
v krokovacom režime s emulačnou doskou. Po tom ako si všimnete zmenu čísla
EvnCnt, nájdete v poli Values výsledky merania troch kanálov. Pri
nasledovnej zmene tohto čísla je obsah poľa Values prepísaná novými údajmi.
Všimnite si spôsob ako komunikuje funkcia
AD1_GetValue. V zdrojovom texte vidíte odovzdanie smerníka
formou názvu poľa Values. Pointre a polia sú v
podstate to isté (aj za mechanizmom poľa hľadajte pointre =
premenné obsahujúce adresu na údaj v pamäti). Názov poľa je
vlastne smerníkom (t.j. pointrom) na začiatok poľa.
Tak, ako sa použil parameter (byte *) Values, predstavuje
odovzdanie jednak hodnoty pointra (t.j. adresy poľa, ale aj
typu údaja v poli t.j. informácia že Values je smerník na
typ byte (byte *). Je to preto, lebo mechanizmus
smerníkov je duálny, adresa je časť informácie a typ a veľkosť
premennej na ktorú smerník ukazuje je jeho druhou časťou
nevyhnutnou pri použití smerníka v C jazyku. Ak chcete sprístupniť
nasledovný prvok poľa pomocou pointra, potrebujete k predošlej
adrese pripočítať číslo, ktoré predstavuje veľkosť údajovej
položky na ktorú pointer ukazuje. Táto informácia je
schovaná v týmto spôsobom "(byte *)".
|
MAIN.C
#define NUM_MEASUREMENTS 10
unsigned int EvnCnt = 0;
byte Values[3];
void main(void)
{
. . .
AD1_Start(); // Run measurements
//measured data are processed in the events
//this cycle waits for end
for(;;) {
if (EvntCnt == NUM_MEASUREMENTS) {
//after 10 cycles the conversion is stopped
AD1_Stop();
}
. . .
}
}
EVENTS.C
extern unsigned int EvnCnt;
extern byte Values[3];
void AD1_OnEnd(void)
{
EvnCnt++; // Increment counter
//measured values are available and may be read:
AD1_GetValue((byte *)Values); // Get AD conversion results
}
This chart shows a sequence of continuous conversion of all channels if an A/D peripheral does not support measuring all channels at once.
Tieto obrázky ukazujú sekvenciu kontinuálnej konverzie všetkých kanálov
ak A/D periféria nepodporuje naraz meranie všetkých kanálov.
This chart shows a sequence of continuous conversion of all channels if an A/D peripheral supports measuring all channels simultaneously.
Tento
obrázok popisuje sekvenciu kontinuálneho merania všetkých kanálov ak A/D
periféria podporuje meranie všetkých kanálov simultánne.
This chart shows a sequence of continuous conversion of all channels if an A/D peripheral supports measuring all channels simultaneously and in addition continuous mode.
Tento
obrázok popisuje sekvenciu kontinuálnej konverzie všetkých kanálov ak A/D
periféria podporuje meranie všetkých kanálov simultánne a v prídavnom
kontinuálnom móde.
One conversion of all channels, with interrupt service
Jedna konverzia všetkých kanálov s obsluhou prerušenia.
All channels are measured after Measure method is invoked.
Property Interrupt service is enabled, Number of conversion is set to 1.
When a conversion of all channels/samples is finished the OnEnd event is invoked and measured values are available (at least until the next conversion is started).
Všetky
kanály sú merané po tom ako sa vyvolá metóda Measure
. Vlastnosť Interrupt service
- obsluha prerušenia je povolená, Number of conversion
- počet konverzií je nastavený na 1. Keď konverzia všetkých
kanálov/vzoriek je ukončená, je vyvolaná udalosť OnEnd
a merané hodnoty sú dostupné (prinajmenšom dovtedy kým sa
neštartne nasledovná konverzia).
The following example demonstrates conversion of all channels.
Nasledovný
príklad demonštruje konverziu všetkých kanálov.
POZNÁMKA K PROGRAMU
Príklady treba brať s rezervou pretože slúžia len pre demonštračné príklady.
Popis algoritmov: Hlavný modul MAIN.C na začiatku zadefinuje pole výsledkov
merania z troch kanálov 0, 1 a 2 t.j. tri vzorky. Príkaz
AD1_Measure(TRUE);
odštartuje celý proces merania na pozadí,
ale parameter TRUE zabezpečí že čakanie na výsledok sa uskutoční ešte v
tomto podprograme. Po nameraní sa vraciame do hlavného programu, kde operáciou
AD1_GetValue(...);
prevezmeme
výsledok.
Za
tým je v hlavnom programe uvedený druhý príklad keď vstúpime do
nekonečnej slučky
for(;;)
{}
. V ňom sa nachádza podmienený príkaz if(ValuesAvailable)
{};
ktorý
sa zrealizuje len keď sa detekujú platné dáta. Premennou
ValuesAvailable
signalizuje modul EVENTS.C hlavnému modulu, že meranie vzoriek je
ukončené a dáta sú platné. Pred každým vzorkovaním musíme
preto v hlavnom programe vynulovať tento príznak
ValuesAvailable=FALSE;
Vzorový
program po každom meraní premaže predošlé meranie.
|
MAIN.C
bool ValuesAvailable = FALSE; // control variable
byte Values[3];
void main(void)
{
AD1_Measure(TRUE);
AD1_GetValue((byte *)Values); // Get AD conversion results
. . .
for(;;) {
if (ValuesAvailable) {
// MIESTO KDE SA DAJÚ POUŽIŤ ÚDAJE UMIESTNENÉ VO Values
ValuesAvailable = FALSE; // clear the control variable
AD1_Measure(FALSE); //start next measurement
}
. . .
}
}
EVENTS.C
extern bool ValuesAvailable;
extern byte Values[3];
void AD1_OnEnd(void)
{
AD1_GetValue((byte *)Values); // Get AD conversion results
ValuesAvailable = TRUE; // set control variable
}
This chart shows a sequence of measurements on all channels if an A/D peripheral does not support measuring all channels simultaneously.
Tento
obrázok ukazuje sekvenciu meraní všetkých kanálov ak A/D periféria
nepodporuje meranie všetkých kanálov simultánne.
|
Popis princípu
V obrázku vidíte tri veci
- Užívateľský
program
- Software
riadiaci ADC bean
- Hardware
ADC beanu
Verzia s parametrom FALSE
Po
tom ako sa rozhodnete merať spustíte program Measure, ktorý pripraví
bean na činnosť a odštartuje operáciu launch(0), ktorá má odmerať
vzorku 0. Nakoľko budeme používať prerušenie, môže bean ukončiť
program (svetlo zelený) a vrátiť sa do hlavného programu kde sa bude
pokračovať zatiaľ na iných úlohách. Hardware zatiaľ meria údaj a to
trvá určitú dobu (naznačenú modrou). Ak meranie skončí dôjde k prerušeniu
hlavného progranu a vstúpime do obsluhy prerušenia beanu. Tento si pamätá,
že čaká na hodnotu 0, preto ju niekam uloží a odštartuje operáciu
launch(1) pre vzorku 1. Hneď potom sa vráti do hlavného programu, ktorý
si plní svoje úlohy. Meranie hodnoty skončí a vyvolá sa prerušenie
beanu. Zase sa uloží nameraná hodnota a odštartuje sa launch(2) meranie
poslednej vzorky 2. Ako v predošlých prípadoch sa vrátime do hlavného
programu. Po domeraní dôjde k poslednému prerušeniu. Bean má tri vzorky
zavolá podprogram OnEnd() ktorá slúži na použitie výsledku merania a
do ktorej obsahu ste mohli pridať vlastný obslužný kód. Ten po skončení
sa vráti do obsluhy beanu, ktorý deaktivuje a vráti sa už natrvalo do
hlavného programu.
|
Verzia s parametrom TRUE
Líši
sa len v tom že obsluha beanu nevracia
sa do hlavného programu,
t.j. všetky ostatné činnosti vtedy stoja a bean čaká na výsledok
merania.
|
This chart shows a sequence of measurements on all channels if an A/D peripheral supports measuring all channels simultaneously. Number of measurement is set to 2.
Tento obrázok ukazuje meranie všetkých kanálov ak A/D periféria podporuje meranie
všetkých kanálov simultánne. Počet meraní je nastavené na 2.
One conversion of a specified channel, with interrupt service
Jedna konverzia špecifikovaného kanála s obsluhou prerušenia.
The conversion of single channel can be done using MeasureChan method.
Property Interrupt service is enabled, Number of conversion is set to 1.
When a conversion of a channel/sample is finished the OnEnd event is invoked and the measured value is available by until the next conversion is
started.
Konverzia jednoduchého kanála može byť uskutočnená použitím metódy
MeasureChan. Vlastnosť Interrupt service
t.j. obsluha prerušenia je povolená, Number of conversion
- počet konverzií (A/D) je nastavený na 1. Keď je konverzia kanálu/vzorky
ukončená vyvolá sa udalosť OnEnd a
meraná hodnota je dostupná do času pokiaľ sa nasledovná konverzia neodštartuje.
The following example demonstrates periodic measurement of three channels in the
loop.
Nasledovný príklad demonštruje periodické meranie troch kanálov v cykle.
MAIN.C
bool ValueAvailable = FALSE; // control variable
byte Value;
byte channel = 0;
void main(void)
{
. . .
AD1_MeasureChan(TRUE, channel);
AD1_GetChanValue(channel, &Value);
for(;;) {
if (ValueAvailable) {
ValueAvailable = FALSE; // clear the control variable
// an action, i.e. process the measured value
++channel;
if (channel > 3) channel = 0;
AD1_MeasureChan(FALSE, channel);
}
. . .
}
}
EVENTS.C
extern bool ValueAvailable;
extern byte Value;
extern byte channel;
void AD1_OnEnd(void)
{
// Get AD conversion results of the specified channel
AD1_GetChanValue(channel, &Value);
ValueAvailable = TRUE; // set control variable
}
The following chart shows single conversion of selected channel, the first conversion without waiting for a result and the second conversion with waiting for a
result.
Nasledovný obrázok ukazuje jednoduchú konverziu navoleného kanála, prvá
konverzia je bez čakania na výsledok a druhá konverzia je s čakaním na výsledok
|
Popis princípu
V obrázku vidíte tri veci
- Užívateľský
program
- Software
riadiaci ADC bean
- Hardware
ADC beanu
Verzia s parametrom FALSE
Po
tom ako sa rozhodnete merať spustíte program MeasureChan, ktorý pripraví
bean na činnosť a odštartuje operáciu launch(1), ktorá má odmerať
vzorku 1. Nakoľko budeme používať prerušenie, môže bean ukončiť
program (svetlo zelený) a vrátiť sa do hlavného programu kde sa bude
pokračovať zatiaľ na iných úlohách. Hardware zatiaľ meria údaj a to
trvá určitú dobu (naznačenú modrou). Ak meranie skončí dôjde k prerušeniu
hlavného progranu a vstúpime do obsluhy prerušenia beanu. Bean zavolá podprogram
OnEnd() ktorá slúži na použitie výsledku merania a
do ktorej obsahu ste mohli pridať vlastný obslužný kód. Ten po skončení
sa vráti do obsluhy beanu, ktorý deaktivuje a vráti sa už natrvalo do
hlavného programu.
|
Verzia s parametrom TRUE
Líši
sa len v tom že obsluha beanu nevracia
sa do hlavného programu,
t.j. všetky ostatné činnosti vtedy stoja a bean čaká na výsledok
merania.
|
One conversion of all channels, in polling mode
Jedna konverzia všetkých kanálov v pool režime.
The measurement on all channels is performed in Measure method, i.e., Measure method does not finish until the conversion
of all channels is finished.
Property Interrupt service is disabled, Number of conversion is set to 1.
Meranie všetkých kanálov je vykonané v Measure
/Meranie/ metóde, t.j. Measure metóda
sa neskončí skôr pokiaľ konverzia všetkých kanálov sa neskončí.
Vlastnosť Interrupt service
- obsluha prerušenia je zakázaná, Number of conversion
- počet meraní je nastavený na 1.
Poznámka k programu
Nasledovný obrázok /pravdepodobne
s chybou! lebo by mal byť podobný ako ten za ním/
používa len software beanu a main modul bez modulu obsluhy
prerušenia. AD1_Measure(FALSE); odštartuje hardware
prevodníka a FALSE by ho mal vrátiť okamžite do hlavného
programu. My však potrebujeme nejako detekovať že výsledok
merania už existuje. Nasledovný príkaz má vlastne takýto
tvar while( ... ) < prázdny príkaz> ; t.j.
pred bodkočiarkou nie je nič čo sa može vykonať. Vykonávací
výraz je schovaný vo vnútri podmienky AD1_GetValue(). Jeho
úlohou je prevziať namerané hodnoty. Stav toho prevzatia je
signalizovaný menom volanej funkcie. Samozrejme pokiaľ
hardware ešte nenameral hodnotu vracia táto funkcia hodnotu
ERR_NOTAVAIL. Preto v cykle opakujeme znova a znova preberanie
hodnoty.
Vo chvíli keď meranie umiestni výsledok do
poľa Values, program to detekuje a pokračuje v behu hlavného
programu. |
MAIN.C
bool ValuesAvailable = FALSE; // control variable
byte Values[3];
void main(void)
{
. . .
AD1_Measure(FALSE); // measure all channel, not wait for result
while (AD1_GetValue((byte *)Values) == ERR_NOTAVAIL); // Wait for result
. . .
AD1_Measure(TRUE); // measure all channel, wait for result
AD1_GetValue((byte *)Values); // Get AD conversion results
.
. .
}
This chart shows a sequence of conversion of all channels if an A/D peripheral does not support measuring all channels simultaneously.
Tento obrázok popisuje konverziu všetkých kanálov ak A/D periféria
nepodporuje meranie všetkých kanálov simultánne. (Poznámka
autora slovenského textu: Nasledovný obrázok je podozrivý, lebo pri
parametri FALSE by mal nastať návrat do hlavného programu /pozrite si
nasledovný obrázok ktorý je správny/. Pri zakázanom prerušení by však
neexistovala metóda ako sa vrátiť do obsluhy beanu ADC. )
This chart shows a sequence of conversion of all channels if an A/D peripheral supports measuring all channels at once.
Tento
obrázok popisuje sekvenciu konverzie všetkých kanálov ak A/D periféria
podporuje meranie všetkých kanálov naraz.
This chart shows a sequence of conversion of all channels if an A/D peripheral supports measuring all channels simultaneously. Number of conversion is set to 2.
Tento
obrázok popisuje sekvenciu konverzie všetkých kanálov ak A/D periféria
podporuje meranie všetkých kanálov simultánne. Number of conversion
- počet konverzií je nastavený na 2.
One conversion of all channels of each bean, in shared mode
Jedna konverzia všetkých kanálov každého beanu v zdielanom režime.
Several ADC beans can be used for one ADC device. This example assumes
that two AD converter beans 'AD1' and 'AD2' in the project share one ADC device
(Sharing properties set to enabled).
Two channels (AN0 and AN2 pins) are set in the bean 'AD1' and one channel (AN1 pin) is set in the bean 'AD2'.
Number of conversion of each bean is set to 1.
Niekoľko ADC beanov môže byť použitých pre jedno ADC zariadenie. Tento príklad
predpokláda, že dva AD prevodníkové beany 'AD1' a 'AD2' v projekte zdieľajú
jedno ADC zariadenie. (Sharing properties
- zdielané vlastnosti nastavené na povolené). Tva kanály AN0 a AN1 piny) sú
nastavené v beane 'AD1' a jeden kanál (AN1 pin) je nastavený v beane 'AD2'.
MAIN.C
bool ADResult1; // Flag for bean 'AD1'
bool ADResult2; // Flag for bean 'AD2'
byte Values[2]; // Bean 'AD1' is set to two channels measurement
byte Value; // Bean 'AD2' is set to one channels measurement
void main(void)
{
ADResult1 = FALSE;
ADResult2 = FALSE;
AD1_Measure(FALSE); // Run measurement of two channels from bean 'AD1'
AD2_Measure(FALSE); // Run measurement of two channels from bean 'AD2'
.
. .
while (!ADResult1); // Wait for measurement complete
AD1_GetValue8((byte *)Values); // Get AD conversion results of bean 'AD1'
while (!ADResult2); // Wait for measurement complete
AD1_GetValue8(&Value); // Get AD conversion result of bean 'AD2'
}
EVENTS.C
extern bool ADResult1;
extern bool ADResult2;
void AD1_OnEnd(void)
{
/* Measurement of two channels from bean 'AD1' is completed */
ADResult1 = TRUE;
}
void AD2_OnEnd(void)
{
/* Measurement of one channel from bean 'AD2' is completed */
ADResult2 = TRUE;
}
Poznámky k programu:
Modul EVENTS.C obsahuje definície dvoch externých premenných typu
bool ktoré sú zadefinované v hlavnom module main. Tieto premenné slúžia
ako správy pre hlavný program o stave meraní. Vyplýva to aj z ich názvov
ADResult t.j. výsledok merania pri prevode AD. Úlohou poslať správu bol
poverený samotný bean AD prevodníka.
Program
MAIN.C obsahuje naviac premenné v ktorých sa objaví výsledná nameraná
hodnota. V príklade vidno dve možnosti riešenia. Jedno predstavuje výsledok
jedného kanála umiestnený do jednoduchej premennej a druhý predstavuje výsledok
dvoch kanálov odovzdaný
pomocou poľa. Funkcia AD1_GetValue8(&Value);
má
v parametri uvedenú adresu (&Value)
jednoduchej premennej, ktorá je definovaná v module vo funkcii main.
Program rieši vzorkovanie tak, že hlavný program celý čas čaká na výsledok
merania. Oznámi ho správa ADResult.
Funkcia
AD1_GetValue8((byte
*) Values); má v parametri odovzdanú adresu (t.j. pointer) na pole
vracaných údajov a súčasťou je aj odovzdaný typ údajových položiek
poľa (byte *). To je preto, lebo použitie pointra (smerník, resp.
premenná na adresy) v C jazyku musí byť vždy spojené nielen s hodnotou
adresy ale aj s informáciou o veľkosti premennej na ktorú smerník
ukazuje.
|
For more about typical usage of the bean code please refer to the page Bean Code Typical Usage.
Aby ste zistili viac o typickom použití kódu beanov pozrite si stránku
Bean Code Typical Usage -
Typické použitie kódu Beanu.
|